#include <mutex>
#include <vector>
#include "all.h"

int count = 0;
libco::Mutex s_mutex;
std::mutex mu;

void func1(void *arg) {
    LIBCO_LOG_INFO << "name:" << libco::Thread::GetName()
        << " this.name:" << libco::Thread::GetThis()->getName()
        << " thread name:" << libco::GetThreadName()
        << " id:" << libco::GetThreadId()
        << " this.id:" << libco::Thread::GetThis()->getId();
    LIBCO_LOG_INFO << "arg: " << *(int*)arg;
    for(int i = 0; i < 10; i++) {
        libco::Mutex::Lock lock(s_mutex);
        LIBCO_LOG_INFO << "current count: " << count;
        ++count;
    }
}

libco::Spinlock spinlock;

void func2(void *arg) {
    // LIBCO_LOG_INFO << "name:" << libco::Thread::GetName()
    //     << " this.name:" << libco::Thread::GetThis()->getName()
    //     << " thread name:" << libco::GetThreadName()
    //     << " id:" << libco::GetThreadId()
    //     << " this.id:" << libco::Thread::GetThis()->getId();
    // LIBCO_LOG_INFO << "arg: " << *(int*)arg;
    for(int i = 0; i < 10; i++) {
        spinlock.lock();
        LIBCO_LOG_INFO << "current count: " << count;
        ++count;
        spinlock.unlock();
    }
}

int main(int argc, char *argv[]) {
    std::vector<libco::Thread::ptr> thrs;
    int arg = 123456;
    int th_num = 10;
    for(int i = 0; i < th_num; i++) {
        // 带参数的线程用std::bind进行参数绑定
        libco::Thread::ptr thr(new libco::Thread(std::bind(func2, &arg)));
        thrs.push_back(thr);
    }

    for(int i = 0; i < th_num; i++) {
        thrs[i]->join();
    }
    
    LIBCO_LOG_INFO << "count = " << count;
    return 0;
}

